# -*- coding: utf-8 -*-
import requests
import json
from config.LoadConfig import get_config


# 全局默认配置
__task_server_conf = get_config("task_server")
_DEFAULT_HOST =__task_server_conf.get("host","")
_DEFAULT_PORT = __task_server_conf.get("port",5000)

class HttpRequest:
    """
    通用 HTTP 请求客户端
    支持默认配置，也支持自定义实例
    """
    def __init__(self, host=None, port=None):
        self.host = host
        self.port = port
        self.session = requests.Session()

    def request(self, method, path, host=None, port=None, params=None, json=None, data=None, headers=None, timeout=600, **kwargs):
        # 从左到右依次检查，取第一个真值
        target_host = host or self.host or _DEFAULT_HOST
        target_port = port or self.port or _DEFAULT_PORT

        base_url = f"http://{target_host}"
        if target_port:
            base_url = f"{base_url}:{target_port}"
        url = f"{base_url}{path}"

        final_headers = {}
        if json is not None:
            final_headers["Content-Type"] = "application/json"
        if headers:
            final_headers.update(headers)

        request_kwargs = {
            "url": url,
            "method": method.upper(),
            "params": params,
            "json": json,
            "data": data,
            "timeout": timeout,
            "headers": final_headers if final_headers else None,
            **{k: v for k, v in kwargs.items() if k not in ['verify', 'cert']}
        }

        try:
            print(f"📤 [{method.upper()}] {url}")
            if json:
                print(f"JSON: {json}")
            if data:
                print(f"Data: {data}")
            if params:
                print(f"Params: {params}")

            response = self.session.request(**request_kwargs)
            print(f"✅ 成功 | 状态码: {response.status_code}")
            return response

        except requests.exceptions.Timeout:
            print(f"❌ 超时 | {url}")
            return None
        except requests.exceptions.ConnectionError:
            print(f"❌ 连接失败 | {url}")
            return None
        except requests.exceptions.RequestException as e:
            print(f"❌ 请求异常: {e}")
            return None

    def close(self):
        self.session.close()

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()


# 🌟 全局默认客户端实例（单例模式的核心）
_default_client = None


def get_default_client():
    """
    获取默认的 HttpRequest 客户端实例（单例）
    第一次调用时创建，之后复用
    """
    global _default_client
    if _default_client is None:
        _default_client = HttpRequest(host=_DEFAULT_HOST, port=_DEFAULT_PORT)
    return _default_client


def do_request(method, path, host=None, port=None, **kwargs):
    """
    便捷函数：使用默认客户端发起请求
    大多数情况下你应该使用这个函数

    :param method: GET, POST 等
    :param path: 请求路径，如 /task/query
    :param host: 覆盖默认 host
    :param port: 覆盖默认 port
    :param kwargs: 其他传递给 request 的参数（json, data, params, headers 等）
    :return: 响应对象或 None
    """
    client = get_default_client()
    resp= client.request(method=method, path=path, host=host, port=port, **kwargs)
    response=resp.json()
    return response.get('success',False), response.get("data",[])



def do_query_request(method, path, host=None, port=None, **kwargs):
    """
    发起查询请求：注意查询回来得结果是驼峰得，不带下划线

    :param method: GET, POST 等
    :param path: 请求路径，如 /task/query
    :param host: 覆盖默认 host
    :param port: 覆盖默认 port
    :param kwargs: 其他传递给 request 的参数（json, data, params, headers 等）
    :return: 响应对象或 None
    """

    client = get_default_client()
    resp= client.request(method=method, path=path, host=host, port=port, **kwargs)
    response=resp.json()
    data=response.get("data",[])
    return response.get('success',False), data




if __name__ == "__main__":
    # ✅ 场景1：最简单调用（使用默认 host:192.168.2.49, port:5000）
    print("\n--- 使用默认配置 ---")
    resp = do_request("POST", "/task/query", json={"conv_id": "abc-123"})
    if resp:
        print("响应:", resp.text[:200])

    # ✅ 场景2：临时覆盖 host 和 port（不影响默认客户端）
    print("\n--- 临时覆盖 host/port ---")
    resp = do_request("GET", "/status", host="192.168.2.50", port=8000, params={"id": 1})
    if resp:
        print("响应:", resp.text[:200])

    # ✅ 场景3：创建独立客户端（用于特殊服务）
    print("\n--- 自定义客户端 ---")
    custom_client = HttpRequest(host="api.example.com", port=8080)
    resp = custom_client.request("GET", "/health")
    if resp:
        print("自定义响应:", resp.text)
    custom_client.close()

    # ✅ 场景4：使用 with 管理生命周期（推荐长任务）
    print("\n--- 使用 with 管理默认客户端 ---")
    with get_default_client() as client:
        r = client.request("GET", "/ping")
        if r:
            print("Ping 响应:", r.text)